package bo;

import IBO.IAdresse;
import IBO.IPersonne;
import boerrors.AdresseMinimumMultiplicityException;
import java.rmi.RemoteException;
import util.Util;

public abstract class Personne implements IPersonne, Cloneable{
        private String _nom;
        private String _prenom;
        private Adresse _adresse;
        private String _telephone;
        private String _email;
        
	//*******************************************************************
	//Constructeurs
	//*******************************************************************
        
        public Personne(    String nom, String prenom, 
                            String telephone, String email) {
                setNom(nom);
                setPrenom(prenom);
                setTelephone(telephone);
                setEmail(email);
        }
        
        public Personne(    String nom, String prenom, Adresse adresse, 
                            String telephone, String email) {
                setNom(nom);
                setPrenom(prenom);
                setAdresse(adresse);
                setTelephone(telephone);
                setEmail(email);
        }
        
        public Personne(    String nom, String prenom, Adresse adresse, 
                            String telephone) {
                setNom(nom);
                setPrenom(prenom);
                setAdresse(adresse);
                setTelephone(telephone);
        }
        
	//*******************************************************************
	//Setters
	//*******************************************************************
        
        public synchronized void setNom(String nom) {
                Util.checkString(nom);
                this._nom = nom;
        }

        public synchronized void setPrenom(String prenom) {
                Util.checkString(prenom);
                this._prenom = prenom;
        }
    
        public synchronized void setAdresse(Adresse adresse) {
                Util.checkObject(adresse);
                this._adresse = adresse;
        }

        public synchronized void setTelephone(String telephone) {
		Util.checkString(telephone);
		this._telephone = telephone;
	}
        
	public synchronized void setEmail(String email) {
		Util.checkString(email);
		this._email = email;
	}

	//*******************************************************************
	//Getters
	//*******************************************************************
        
        public synchronized String getNom() {
                return _nom;
        }

        public synchronized String getPrenom() {
                return _prenom;
        }
        
        public synchronized Adresse getAdresse() throws AdresseMinimumMultiplicityException {
                if(!aUneAdresseValide()) throw new AdresseMinimumMultiplicityException();
        return _adresse;
        }
        
        public synchronized String getTelephone() {
		return _telephone;
	}        

        public synchronized String getEmail() {
		return _email;
	}    
    
        public synchronized  IAdresse getIAdresse() throws RemoteException{
            return this._adresse;
        }
        
	//*******************************************************************
	//Associations
	//*******************************************************************
        
        public boolean enregistrerAdresse(Adresse adresse){
                if (adresse == null) return false;
                if (this._adresse == adresse) return false;
                if (!peutEnregistrerAdresse()) return false;
                this._adresse=adresse;
                return true;
        }
    
        //Aucune suppression de l'adresse n'est autorisée
        
        public boolean peutEnregistrerAdresse(){
                return this._adresse==null;
        }
    
        public boolean aUneAdresseValide(){
                return this._adresse!=null;
        }

	//*******************************************************************
	//Method Clonable
	//*******************************************************************        
        
        @Override
        public Object clone(){
            Personne personne = null;
            try{
                personne = (Personne) super.clone();
                personne._adresse = (Adresse) _adresse.clone();
            }catch(CloneNotSupportedException cnse){
                cnse.printStackTrace(System.err);
            }
            
            return personne;
        }
}